package br.com.usapre.faces;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.business.GradeProdutosBusiness;
import br.com.data.DescontoParceiro;
import br.com.data.GradeProdutos;
import br.com.data.Parceiro;
import br.com.login.faces.SessionUsaPreBean;
import br.com.utilidades.faces.SimpleMessageBean;
import constantes.CONSTANTES;

/**
 * @version 1.0.0
 * @since Fevereiro,28 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("session")
public class LojistaBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = -3177958520933230812L;

    private SessionUsaPreBean sessionUsaPreBean;

    private Integer codigoTela;

    public static final Integer SOLICITAR_CREDENCIAMENTO = 1;
    public static final Integer CADASTRAR_DESCONTO = 2;
    public static final Integer CADASTRAR_PRECOS = 3;
    public static final Integer GERENCIAMENTO_VENDAS_REPASSES = 4;
    public static final Integer RECEBIMENTO_ANTECIPADO = 5;
    public static final Integer VANTAGENS = 6;
    public static final Integer LIBERACAO_PARCEIRO = 7;

    private Parceiro parceiro;

    private String novoDesconto;
    private Date novaDataDesconto;
    private Double maiorDesconto;

    private GradeProdutosBusiness gradeProdutosBusinessImpl;

    private DescontoParceiro descontoParceiro;

    private Integer tamanhoListaMaiorDesconto = 0;
    private Integer tamanhoListaProdutoDesconto = 0;
    private Integer tamanhoLista = 0;
    private Integer tamanholistaPrecoCadastrado = 0;

    /**
     * Construtor
     */
    @Autowired
    public LojistaBean(SessionUsaPreBean sessionUsaPreBean, GradeProdutosBusiness gradeProdutosBusinessImpl) {

	this.sessionUsaPreBean = sessionUsaPreBean;

	this.gradeProdutosBusinessImpl = gradeProdutosBusinessImpl;

	parceiro = sessionUsaPreBean.getParceiro();

	if (parceiro == null)
	    codigoTela = SOLICITAR_CREDENCIAMENTO;
	else {
	    if (parceiro.getStatusCredenciamento().equals(5))
		codigoTela = CADASTRAR_DESCONTO;
	    else
		codigoTela = SOLICITAR_CREDENCIAMENTO;
	}

	reset();
    }

    /**
     * reset
     */
    public void reset() {

	if (parceiro != null) {

	    this.tamanhoLista = 0;
	    this.tamanhoListaMaiorDesconto = 0;
	    this.tamanhoListaProdutoDesconto = 0;
	    this.tamanholistaPrecoCadastrado = 0;

	    List<GradeProdutos> listaGradeProduto = this.gradeProdutosBusinessImpl
		    .buscarGradePorParceiro(this.parceiro);

	    Double maiorDesconto = 0d;

	    for (GradeProdutos gradeProdutos : listaGradeProduto) {
		if (gradeProdutos.getDesconto() > maiorDesconto) {
		    maiorDesconto = gradeProdutos.getDesconto();
		}
	    }

	    this.tamanhoListaProdutoDesconto = listaGradeProduto.size();

	    for (GradeProdutos gradeProdutos : listaGradeProduto) {
		this.tamanhoLista++;
		if (gradeProdutos.getDesconto().equals(maiorDesconto)) {
		    this.tamanhoListaMaiorDesconto++;
		}

		if (gradeProdutos.getPreco().equals(gradeProdutos.getValor())) {
		    this.tamanhoListaProdutoDesconto--;
		}

		if (gradeProdutos.getValor() > 0) {
		    this.tamanholistaPrecoCadastrado++;
		}
	    }

	    this.maiorDesconto = maiorDesconto;
	}
    }

    public boolean isTelaSolicitarDisponivel() {
	if (parceiro == null) {
	    return Boolean.TRUE;
	} else {
	    if (parceiro.getStatusCredenciamento().equals(5))
		return Boolean.FALSE;
	    else
		return Boolean.TRUE;
	}
    }

    public boolean isTelaLiberacaoParceiroDisponivel() {
	try {
	    if (parceiro.getStatusCredenciamento().equals(5))
		return Boolean.TRUE;
	    else
		return Boolean.FALSE;
	} catch (Exception e) {
	    return Boolean.FALSE;
	}

    }

    public boolean isTelaSolicitarCredenciamento() {
	if (codigoTela == SOLICITAR_CREDENCIAMENTO)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaCadastrarDesconto() {
	if (codigoTela == CADASTRAR_DESCONTO)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaCadastrarPreco() {
	if (codigoTela == CADASTRAR_PRECOS)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaGerenciamentoVendasRepasse() {
	if (codigoTela == GERENCIAMENTO_VENDAS_REPASSES)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaRecebimentoAntecipado() {
	if (codigoTela == RECEBIMENTO_ANTECIPADO)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaVantagens() {
	if (codigoTela == VANTAGENS)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    public boolean isTelaLiberacaoParceiro() {
	if (codigoTela == LIBERACAO_PARCEIRO)
	    return Boolean.TRUE;
	else
	    return Boolean.FALSE;
    }

    /**
     * solicitarCredenciamento
     */
    public void solicitarCredenciamento() {
	codigoTela = SOLICITAR_CREDENCIAMENTO;
	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getParceiro() == null) {
		sessionUsaPreBean.setLogado(Boolean.FALSE);
		sessionUsaPreBean.setParceiro(null);
		sessionUsaPreBean.setUsuario(null);
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaSolicitarCredenciamento.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    } else {
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDescontoLogado.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaSolicitarCredenciamento.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}
    }

    /**
     * solicitarCredenciamentoCadastro
     */
    public void solicitarCredenciamentoCadastro() {
	codigoTela = SOLICITAR_CREDENCIAMENTO;
	try {
	    FacesContext.getCurrentInstance().getExternalContext()
		    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaSolicitarCredenciamentoCadastro.jsf");
	} catch (Exception ex) {
	    ex.printStackTrace();
	}
    }

    /**
     * cadastrarDesconto
     */
    public void cadastrarDesconto() {
	codigoTela = CADASTRAR_DESCONTO;
	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getParceiro() == null) {
		sessionUsaPreBean.setLogado(Boolean.FALSE);
		sessionUsaPreBean.setParceiro(null);
		sessionUsaPreBean.setUsuario(null);
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDesconto.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    } else {
		this.reset();
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDescontoLogado.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDesconto.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}
    }

    /**
     * cadastrarPrecos
     */
    public void cadastrarPrecos() {
	codigoTela = CADASTRAR_PRECOS;
	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getParceiro() == null) {
		sessionUsaPreBean.setLogado(Boolean.FALSE);
		sessionUsaPreBean.setParceiro(null);
		sessionUsaPreBean.setUsuario(null);
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDesconto.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    } else {
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarPrecosLogado.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarPrecos.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}
    }

    /**
     * gerenciamentoVendasRepasses
     */
    public void gerenciamentoVendasRepasses() {
	codigoTela = GERENCIAMENTO_VENDAS_REPASSES;
	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getParceiro() == null) {
		sessionUsaPreBean.setLogado(Boolean.FALSE);
		sessionUsaPreBean.setParceiro(null);
		sessionUsaPreBean.setUsuario(null);
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDesconto.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    } else {
		try {
		    FacesContext
			    .getCurrentInstance()
			    .getExternalContext()
			    .redirect(
				    "/" + CONSTANTES.URLUSAPRE + "/lojistaGerenciamentoVendasRepassesExtratoVendas.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaGerenciamentoVendasRepasses.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}
    }

    /**
     * recebimentoAntecipado
     */
    public void recebimentoAntecipado() {
	codigoTela = RECEBIMENTO_ANTECIPADO;
	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getParceiro() == null) {
		sessionUsaPreBean.setLogado(Boolean.FALSE);
		sessionUsaPreBean.setParceiro(null);
		sessionUsaPreBean.setUsuario(null);
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDesconto.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    } else {
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaRecebimentoAntecipadoLogado.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaRecebimentoAntecipado.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}
    }

    /**
     * vantagem
     */
    public void vantagem() {
	codigoTela = VANTAGENS;
	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getParceiro() == null) {
		sessionUsaPreBean.setLogado(Boolean.FALSE);
		sessionUsaPreBean.setParceiro(null);
		sessionUsaPreBean.setUsuario(null);
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDesconto.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    } else {
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaVantagensLogado.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaVantagens.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}
    }

    /**
     * liberacaoParceiro
     */
    public void liberacaoParceiro() {
	codigoTela = LIBERACAO_PARCEIRO;
	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getParceiro() == null) {
		sessionUsaPreBean.setLogado(Boolean.FALSE);
		sessionUsaPreBean.setParceiro(null);
		sessionUsaPreBean.setUsuario(null);
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaCadastrarDesconto.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    } else {
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/lojistaLiberacaoLojista.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    }
	} else {
	    System.out.println("Tela não disponivel para usuarios deslogados");
	}
    }

    // SETS AND GETS
    public Integer getCodigoTela() {
	return codigoTela;
    }

    public void setCodigoTela(Integer codigoTela) {
	this.codigoTela = codigoTela;
    }

    public Parceiro getParceiro() {
	return parceiro;
    }

    public void setParceiro(Parceiro parceiro) {
	this.parceiro = parceiro;
    }

    public String getNovoDesconto() {
	return novoDesconto;
    }

    public void setNovoDesconto(String novoDesconto) {
	this.novoDesconto = novoDesconto;
    }

    public Date getNovaDataDesconto() {
	return novaDataDesconto;
    }

    public void setNovaDataDesconto(Date novaDataDesconto) {
	this.novaDataDesconto = novaDataDesconto;
    }

    public DescontoParceiro getDescontoParceiro() {
	return descontoParceiro;
    }

    public void setDescontoParceiro(DescontoParceiro descontoParceiro) {
	this.descontoParceiro = descontoParceiro;
    }

    /**
     * Retorna o valor do atributo maiorDesconto.
     * 
     * @return maiorDesconto
     */
    public Double getMaiorDesconto() {
	return maiorDesconto;
    }

    /**
     * Define o valor do atributo maiorDesconto.
     * 
     * @param maiorDesconto
     *            valor a ser atribuído
     */
    public void setMaiorDesconto(Double maiorDesconto) {
	this.maiorDesconto = maiorDesconto;
    }

    /**
     * Retorna o valor do atributo tamanhoListaMaiorDesconto.
     * 
     * @return tamanhoListaMaiorDesconto
     */
    public Integer getTamanhoListaMaiorDesconto() {
	return tamanhoListaMaiorDesconto;
    }

    /**
     * Define o valor do atributo tamanhoListaMaiorDesconto.
     * 
     * @param tamanhoListaMaiorDesconto
     *            valor a ser atribuído
     */
    public void setTamanhoListaMaiorDesconto(Integer tamanhoListaMaiorDesconto) {
	this.tamanhoListaMaiorDesconto = tamanhoListaMaiorDesconto;
    }

    /**
     * Retorna o valor do atributo tamanhoLista.
     * 
     * @return tamanhoLista
     */
    public Integer getTamanhoLista() {
	return tamanhoLista;
    }

    /**
     * Define o valor do atributo tamanhoLista.
     * 
     * @param tamanhoLista
     *            valor a ser atribuído
     */
    public void setTamanhoLista(Integer tamanhoLista) {
	this.tamanhoLista = tamanhoLista;
    }

    /**
     * Retorna o valor do atributo tamanhoListaProdutoDesconto.
     * 
     * @return tamanhoListaProdutoDesconto
     */
    public Integer getTamanhoListaProdutoDesconto() {
	return tamanhoListaProdutoDesconto;
    }

    /**
     * Define o valor do atributo tamanhoListaProdutoDesconto.
     * 
     * @param tamanhoListaProdutoDesconto
     *            valor a ser atribuído
     */
    public void setTamanhoListaProdutoDesconto(Integer tamanhoListaProdutoDesconto) {
	this.tamanhoListaProdutoDesconto = tamanhoListaProdutoDesconto;
    }

    /**
     * Retorna o valor do atributo tamanholistaPrecoCadastrado.
     * 
     * @return tamanholistaPrecoCadastrado
     */
    public Integer getTamanholistaPrecoCadastrado() {
	return tamanholistaPrecoCadastrado;
    }

    /**
     * Define o valor do atributo tamanholistaPrecoCadastrado.
     * 
     * @param tamanholistaPrecoCadastrado
     *            valor a ser atribuído
     */
    public void setTamanholistaPrecoCadastrado(Integer tamanholistaPrecoCadastrado) {
	this.tamanholistaPrecoCadastrado = tamanholistaPrecoCadastrado;
    }
}
